package handler

import (
	"Data-API-MCP/backend/internal/domain/entity"
	"Data-API-MCP/backend/internal/domain/service"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
)

// APIHandler API处理器
type APIHandler struct {
	apiService *service.APIService
}

// NewAPIHandler 创建API处理器
func NewAPIHandler(apiService *service.APIService) *APIHandler {
	return &APIHandler{
		apiService: apiService,
	}
}

// CreateAPI 创建API
// @Summary 创建API
// @Description 创建新的API接口
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param api body object true "API信息"
// @Success 200 {object} object "成功"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis [post]
func (h *APIHandler) CreateAPI(c *gin.Context) {
	var api entity.API
	if err := c.ShouldBindJSON(&api); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	if err := h.apiService.CreateAPI(c.Request.Context(), &api); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusCreated, api)
}

// GetAPIs 获取API列表
// @Summary 获取API列表
// @Description 获取所有API接口列表
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param page query int false "页码"
// @Param size query int false "每页数量"
// @Success 200 {array} object "API列表"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis [get]
func (h *APIHandler) GetAPIs(c *gin.Context) {
	offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0"))
	limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10"))

	apis, err := h.apiService.ListAPIs(c.Request.Context(), offset, limit)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, apis)
}

// GetAPI 获取单个API
// @Summary 获取单个API
// @Description 获取指定ID的API接口
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Success 200 {object} object "API信息"
// @Failure 401 {object} object "未授权"
// @Failure 404 {object} object "API不存在"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis/{id} [get]
func (h *APIHandler) GetAPI(c *gin.Context) {
	id := c.Param("id")
	api, err := h.apiService.GetAPI(c.Request.Context(), id)
	if err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "API不存在"})
		return
	}

	c.JSON(http.StatusOK, api)
}

// UpdateAPI 更新API
// @Summary 更新API
// @Description 更新指定ID的API接口
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Param api body object true "API信息"
// @Success 200 {object} object "成功"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
// @Failure 404 {object} object "API不存在"
// @Failure 500 {object} object "服务器错误"
func (h *APIHandler) UpdateAPI(c *gin.Context) {
	id := c.Param("id")
	var api entity.API
	if err := c.ShouldBindJSON(&api); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	api.ID = id
	if err := h.apiService.UpdateAPI(c.Request.Context(), &api); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, api)
}

// DeleteAPI 删除API
// @Summary 删除API
// @Description 删除指定ID的API接口
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Success 200 {object} object "成功"
// @Failure 401 {object} object "未授权"
// @Failure 404 {object} object "API不存在"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis/{id} [delete]
func (h *APIHandler) DeleteAPI(c *gin.Context) {
	id := c.Param("id")
	if err := h.apiService.DeleteAPI(c.Request.Context(), id); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.Status(http.StatusNoContent)
}

// PublishAPI 发布API
// @Summary 发布API
// @Description 发布指定ID的API接口
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Success 200 {object} object "成功"
// @Failure 401 {object} object "未授权"
// @Failure 404 {object} object "API不存在"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis/{id}/publish [post]
func (h *APIHandler) PublishAPI(c *gin.Context) {
	id := c.Param("id")
	if err := h.apiService.PublishAPI(c.Request.Context(), id); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.Status(http.StatusOK)
}

// UnpublishAPI 取消发布API
// @Summary 取消发布API
// @Description 取消发布指定ID的API接口
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Success 200 {object} object "成功"
// @Failure 401 {object} object "未授权"
// @Failure 404 {object} object "API不存在"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis/{id}/unpublish [post]
func (h *APIHandler) UnpublishAPI(c *gin.Context) {
	id := c.Param("id")
	if err := h.apiService.UnpublishAPI(c.Request.Context(), id); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.Status(http.StatusOK)
}

// GetAPIVersions 获取API版本列表
// @Summary 获取API版本列表
// @Description 获取指定API的版本列表
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Success 200 {array} object "API版本列表"
// @Failure 401 {object} object "未授权"
// @Failure 404 {object} object "API不存在"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis/{id}/versions [get]
func (h *APIHandler) GetAPIVersions(c *gin.Context) {
	id := c.Param("id")
	versions, err := h.apiService.ListAPIVersions(c.Request.Context(), id)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, versions)
}

// CreateAPIVersion 创建API版本
// @Summary 创建API版本
// @Description 创建新的API版本
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Param apiVersion body object true "API版本信息"
// @Success 200 {object} object "成功"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis/{id}/versions [post]
func (h *APIHandler) CreateAPIVersion(c *gin.Context) {
	id := c.Param("id")
	var version entity.APIVersion
	if err := c.ShouldBindJSON(&version); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	version.APIID = id
	if err := h.apiService.CreateAPIVersion(c.Request.Context(), &version); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusCreated, version)
}

// GetAPIVersion 获取API版本
// @Summary 获取API版本
// @Description 获取指定API的版本
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Success 200 {object} object "API版本信息"
// @Failure 401 {object} object "未授权"
// @Failure 404 {object} object "API不存在"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis/{id}/versions/{versionId} [get]
func (h *APIHandler) GetAPIVersion(c *gin.Context) {
	id := c.Param("id")
	version := c.Param("version")
	versions, err := h.apiService.ListAPIVersions(c.Request.Context(), id)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	for _, v := range versions {
		if v.Version == version {
			c.JSON(http.StatusOK, v)
			return
		}
	}

	c.JSON(http.StatusNotFound, gin.H{"error": "API版本不存在"})
}

// UpdateAPIVersion 更新API版本
// @Summary 更新API版本
// @Description 更新指定API的版本
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Param versionId path string true "API版本ID"
// @Param apiVersion body object true "API版本信息"
// @Success 200 {object} object "成功"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
func (h *APIHandler) UpdateAPIVersion(c *gin.Context) {
	id := c.Param("id")
	version := c.Param("version")
	var apiVersion entity.APIVersion
	if err := c.ShouldBindJSON(&apiVersion); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	apiVersion.APIID = id
	apiVersion.Version = version
	if err := h.apiService.UpdateAPIVersion(c.Request.Context(), &apiVersion); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, apiVersion)
}

// DeleteAPIVersion 删除API版本
// @Summary 删除API版本
// @Description 删除指定API的版本
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Param versionId path string true "API版本ID"
// @Success 200 {object} object "成功"
// @Failure 401 {object} object "未授权"
// @Failure 404 {object} object "API不存在"
// @Failure 500 {object} object "服务器错误"
func (h *APIHandler) DeleteAPIVersion(c *gin.Context) {
	id := c.Param("id")
	if err := h.apiService.DeleteAPIVersion(c.Request.Context(), id); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.Status(http.StatusNoContent)
}

// GetAPIDocs 获取API文档
// @Summary 获取API文档
// @Description 获取指定API的文档
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Success 200 {object} object "API文档"
// @Failure 401 {object} object "未授权"
// @Failure 404 {object} object "API不存在"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis/{id}/docs [get]
func (h *APIHandler) GetAPIDocs(c *gin.Context) {
	id := c.Param("id")
	doc, err := h.apiService.GetAPIDoc(c.Request.Context(), id)
	if err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "API文档不存在"})
		return
	}

	c.JSON(http.StatusOK, doc)
}

// UpdateAPIDocs 更新API文档
// @Summary 更新API文档
// @Description 更新指定API的文档
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Param apiDocs body object true "API文档"
// @Success 200 {object} object "成功"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
func (h *APIHandler) UpdateAPIDocs(c *gin.Context) {
	id := c.Param("id")
	var doc entity.APIDoc
	if err := c.ShouldBindJSON(&doc); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	doc.APIID = id
	if err := h.apiService.UpdateAPIDoc(c.Request.Context(), &doc); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, doc)
}

// TestAPI 测试API
// @Summary 测试API
// @Description 测试指定API的功能
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Param testData body object true "测试数据"
// @Success 200 {object} object "测试结果"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
// @Failure 404 {object} object "API不存在"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis/{id}/test [post]
func (h *APIHandler) TestAPI(c *gin.Context) {
	id := c.Param("id")
	var testData map[string]interface{}
	if err := c.ShouldBindJSON(&testData); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	result, err := h.apiService.TestAPI(c.Request.Context(), id, testData)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, result)
}

// GetAPIsByConnection 获取指定连接的API列表
// @Summary 获取指定连接的API列表
// @Description 获取指定数据库连接下的所有API
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param connectionId path string true "连接ID"
// @Param page query int false "页码"
// @Param size query int false "每页数量"
// @Success 200 {array} object "API列表"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis/connection/{connectionId} [get]
func (h *APIHandler) GetAPIsByConnection(c *gin.Context) {
	connectionID := c.Param("connectionId")
	offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0"))
	limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10"))

	apis, err := h.apiService.GetAPIsByConnection(c.Request.Context(), connectionID, offset, limit)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, apis)
}

// CreateAPIDocs 创建API文档
// @Summary 创建API文档
// @Description 为指定API创建文档
// @Tags API管理
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "API ID"
// @Param doc body object true "API文档"
// @Success 200 {object} object "成功"
// @Failure 400 {object} object "请求错误"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis/{id}/docs [post]
func (h *APIHandler) CreateAPIDocs(c *gin.Context) {
	id := c.Param("id")
	var doc entity.APIDoc
	if err := c.ShouldBindJSON(&doc); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	doc.APIID = id
	if err := h.apiService.CreateAPIDoc(c.Request.Context(), &doc); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusCreated, doc)
}
